import * as types from'./mutation-types'
import {shuffle} from "../common/js/util";
import {playMode} from "../common/js/config";
import {mode} from "./getters";
import {saveSearch, clearSearch, deleteSearch, savePlay, saveFavorite, deleteFavorite} from 'common/js/cache'

function findIndex(list,song) {

  return list.findIndex((item)=>{
    return item.id===song.id
  })
}

export const selectPlay = function ({commit,state},{list,index}) {

  commit(types.SET_SEQUENCE_LIST,list)
  if (state.mode===playMode.random){
    let randomList = shuffle(list)
    commit(types.SET_PLAY_LIST,randomList)
    index = findIndex(randomList,list[index])
  }else{
    commit(types.SET_PLAY_LIST,list)

  }
  commit(types.SET_CURRENT_INDEX,index)
  commit(types.SET_FULL_SCREEN,true)
  commit(types.SET_PLAYING_STATE,true)
}


export const randomPlay = function ({commit}, {list}) {
  commit(types.SET_PLAY_MODE,playMode.random)
  commit(types.SET_SEQUENCE_LIST,list)
  let randomList = shuffle(list)
  commit(types.SET_PLAY_LIST,randomList)
  commit(types.SET_CURRENT_INDEX,0)
  commit(types.SET_FULL_SCREEN,true)
  commit(types.SET_PLAYING_STATE,true)
}

export const insertSong = function ({commit, state},song) {

  let playlist = state.playlist.slice()
  let sequenceList = state.sequenceList.slice()
  let currentIndex = state.currentIndex
  //记录当前歌曲
  let currentSong = playlist[currentIndex]
  // 查找当前列表中是否有待插入的歌曲并返回其索引
  let fpIndex = findIndex(playlist,song)
  // 因为是插入歌曲,所以索引+1
  currentIndex++
  //插入这首歌到当前索引位置
  playlist.splice(currentIndex,0,song) // 补位插入,所有的这个元素后的数据索引+1
  // 如果已经包含了这首歌
  if (fpIndex>-1){
    // 如果当插入的序号大于列表中的序号
    if(currentIndex>fpIndex){
      playlist.splice(fpIndex,1)  // 如果插入到这首歌后面,就把原来位置的歌删掉
      currentIndex--
    }else{
      playlist.splice(fpIndex+1,1) // 如果插入到这首歌前面,就把原来位置的歌删掉
    }
  }

  let currentSIndex = findIndex(sequenceList,currentSong)+1
  let fsIndex = findIndex(sequenceList, song)
  sequenceList.splice(currentSIndex, 0, song)
  if (fsIndex > -1) {
    if (currentSIndex > fsIndex) {
      sequenceList.splice(fsIndex, 1)
    } else {
      sequenceList.splice(fsIndex + 1, 1)
    }
  }
  commit(types.SET_PLAY_LIST, playlist)
  commit(types.SET_SEQUENCE_LIST, sequenceList)
  commit(types.SET_CURRENT_INDEX, currentIndex)
  commit(types.SET_FULL_SCREEN, true)
  commit(types.SET_PLAYING_STATE, true)

}

export const saveSearchHistory = function ({commit},query) {
  commit(types.SET_SEARCH_HISTORY,saveSearch(query))
}
export const deleteSearchHistory = function ({commit}, query) {
  commit(types.SET_SEARCH_HISTORY, deleteSearch(query))
}

export const clearSearchHistory = function ({commit}) {
  commit(types.SET_SEARCH_HISTORY, clearSearch())
}

export const deleteSong=function ({commit, state}, song) {
  let playlist = state.playlist.slice()
  let sequenceList = state.sequenceList.slice()
  let currentIndex = state.currentIndex
  let pIndex = findIndex(playlist,song)
  playlist.splice(pIndex,1)
  let sIndex = findIndex(sequenceList,song)
  sequenceList.splice(sIndex,1)
  // 删除的歌曲在当前播放歌曲的前面 或者当前播放的歌曲是最后一首歌
  if (currentIndex>pIndex||currentIndex===playlist.length){
    currentIndex--
  }
  commit(types.SET_PLAY_LIST, playlist)
  commit(types.SET_SEQUENCE_LIST, sequenceList)
  commit(types.SET_CURRENT_INDEX, currentIndex)

  // 播放列表中无歌曲将播放状态置为false
  if (!playlist.length){
    commit(types.SET_PLAYING_STATE, false)

  }else{
    // 如果当歌曲切换时处于暂停状态
    if(!state.playing){
      commit(types.SET_TOGGLE_PLAY_STATE,true)
    }
    commit(types.SET_PLAYING_STATE, true)


  }


}

export const deleteSongList = function ({commit}) {
  commit(types.SET_CURRENT_INDEX, -1)
  commit(types.SET_PLAY_LIST, [])
  commit(types.SET_SEQUENCE_LIST, [])
  commit(types.SET_PLAYING_STATE, false)
}

export const savePlayHistory = function ({commit},song) {

  commit(types.SET_PLAY_HISTORY,savePlay(song))

}

export const saveFavoriteList = function ({commit}, song) {
  commit(types.SET_FAVORITE_LIST, saveFavorite(song))
}

export const deleteFavoriteList = function ({commit}, song) {
  commit(types.SET_FAVORITE_LIST, deleteFavorite(song))
}
